package com.core;

import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.VertxOptions;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.file.FileProps;
import io.vertx.core.file.FileSystem;

/**
 * @author leonard
 * @Date 20220413
 * @Description vertx core知识点
 */
public class MainClass {

  public static void main(String[] args) {
    //大部分应用只有一个vertx对象，用来完成所有事情的核心组件
    Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(40));

    //触发计时器驱动
/*    vertx.setPeriodic(1000,id->{
      System.out.println("you are fired");
    });*/

    //异步 用handler来处理，用future来存载异步结果
    FileSystem fileSystem = vertx.fileSystem();

    Future<FileProps> f1 = fileSystem.props("D:\\code_repo\\back_code\\starter\\README.md");
    f1.onComplete(ar->{
      System.out.println("ar====>"+ar.toString());
      if(ar.succeeded()){
        FileProps props = ar.result();
        System.out.println("FileProps====>"+props.toString());

        System.out.println("File size: "+props.size());
      }else{
        System.out.println("Fail: "+ar.cause().getMessage());
      }
    });

    //future的组合与协作
    Future<Void> f2 = fileSystem
      .createFile("/foo")
      .compose(v -> {
        // createFile文件创建完成后执行
        return fileSystem.writeFile("/foo", Buffer.buffer());
      })
      .compose(v -> {
        // writeFile文件写入完成后执行
        return fileSystem.move("/foo", "/bar");
      });

    //CompositeFuture.all 所有都成功的时候返回True
    //CompositeFuture.any CompositeFuture.join
    CompositeFuture.all(f1,f2).onComplete(ar->{
      if (ar.succeeded()) {
        // 至少一个成功
        System.out.println("success");
      } else {
        // 所有的都失败
        System.out.println("defeat");
      }

    });
  }
}
